package cn.com.dcsgo.service.impl;

import cn.com.dcsgo.constant.MqConst;
import cn.com.dcsgo.exception.UuPreferredException;
import cn.com.dcsgo.mapper.SkuInfoMapper;
import cn.com.dcsgo.model.product.SkuAttrValue;
import cn.com.dcsgo.model.product.SkuImage;
import cn.com.dcsgo.model.product.SkuInfo;
import cn.com.dcsgo.model.product.SkuPoster;
import cn.com.dcsgo.result.ResultCodeEnum;
import cn.com.dcsgo.service.*;
import cn.com.dcsgo.vo.product.SkuInfoQueryVo;
import cn.com.dcsgo.vo.product.SkuInfoVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

/**
 * <p>
 * sku信息 服务实现类
 * </p>
 *
 * @author Dcsgo
 * @since 2025-04-07
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class SkuInfoServiceImpl extends ServiceImpl<SkuInfoMapper, SkuInfo> implements SkuInfoService {
    private final SkuImageService skuImageService;
    private final SkuPosterService skuPosterService;
    private final SkuAttrValueService skuAttrValueService;
    private final RabbitService rabbitService;

    @Override
    public IPage<SkuInfo> selectByPage(Page<SkuInfo> pageParma, SkuInfoQueryVo skuInfoQueryVo) {
        // 构造查询条件
        LambdaQueryWrapper<SkuInfo> wrapper = new LambdaQueryWrapper<>();
        String keyword = skuInfoQueryVo.getKeyword();
        Long categoryId = skuInfoQueryVo.getCategoryId();
        String skuType = skuInfoQueryVo.getSkuType();
        if (!StringUtils.isEmpty(keyword)) {
            wrapper.like(SkuInfo::getSkuName, keyword);
        }
        if (!StringUtils.isEmpty(skuType)) {
            wrapper.like(SkuInfo::getSkuType, skuType);
        }
        if (categoryId != null) {
            wrapper.eq(SkuInfo::getCategoryId, categoryId);
        }
        return baseMapper.selectPage(pageParma, wrapper);
    }

    @Override
    public void saveSkuInfo(SkuInfoVo skuInfoVo) {
        // sku_info中添加skuInfo
        SkuInfo skuInfo = new SkuInfo();
        BeanUtils.copyProperties(skuInfoVo, skuInfo);
        baseMapper.insert(skuInfo);

        // 添加商品海报信息到sku_poster
        if (!CollectionUtils.isEmpty(skuInfoVo.getSkuPosterList())) {
            skuInfoVo.getSkuPosterList().forEach(skuPoster -> skuPoster.setSkuId(skuInfo.getId()));
            skuPosterService.saveBatch(skuInfoVo.getSkuPosterList());
        }

        // 添加商品属性分组信息到sku_attr_value
        if (!CollectionUtils.isEmpty(skuInfoVo.getSkuAttrValueList())) {
            skuInfoVo.getSkuAttrValueList().forEach(skuAttrValue -> skuAttrValue.setSkuId(skuInfo.getId()));
            skuAttrValueService.saveBatch(skuInfoVo.getSkuAttrValueList());
        }

        // 添加商品图片信息到sku_image
        if (!CollectionUtils.isEmpty(skuInfoVo.getSkuImagesList())) {
            skuInfoVo.getSkuImagesList().forEach(skuImage -> skuImage.setSkuId(skuInfo.getId()));
            skuImageService.saveBatch(skuInfoVo.getSkuImagesList());
        }
    }

    @Override
    public SkuInfoVo getSkuInfoVoById(Long id) {
        // 查询sku基本信息
        SkuInfoVo skuInfoVo = new SkuInfoVo();
        SkuInfo skuInfo = baseMapper.selectById(id);
        BeanUtils.copyProperties(skuInfo, skuInfoVo);

        // 查询sku图片信息
        List<SkuImage> images = skuImageService.listBySkuId(id);
        skuInfoVo.setSkuImagesList(images);

        // 查询sku海报信息
        List<SkuPoster> posters = skuPosterService.listBySkuId(id);
        skuInfoVo.setSkuPosterList(posters);

        // 查询sku商品属性信息
        List<SkuAttrValue> trrAttrValues = skuAttrValueService.listBySkuId(id);
        skuInfoVo.setSkuAttrValueList(trrAttrValues);

        return skuInfoVo;
    }

    @Override
    public void updateSkuInfoById(SkuInfoVo skuInfoVo) {
        // 更新策略:关联表中的相关数据现删除后添加
        // 更新基本信息
        SkuInfo skuInfo = new SkuInfo();
        log.info("skInfoVo id: {}", skuInfoVo.getId());
        BeanUtils.copyProperties(skuInfoVo, skuInfo);
        log.info("copyProperties after skuInfo id: {}", skuInfo.getId());
        baseMapper.updateById(skuInfo);

        // 更新图片信息
        skuImageService.remove(new LambdaQueryWrapper<SkuImage>().eq(SkuImage::getSkuId, skuInfo.getId()));
        // 添加商品图片信息到sku_image
        if (!CollectionUtils.isEmpty(skuInfoVo.getSkuImagesList())) {
            skuInfoVo.getSkuImagesList().forEach(skuImage -> skuImage.setSkuId(skuInfo.getId()));
            skuImageService.saveBatch(skuInfoVo.getSkuImagesList());
        }

        // 更新海报信息
        skuPosterService.remove(new LambdaQueryWrapper<SkuPoster>().eq(SkuPoster::getSkuId, skuInfo.getId()));
        // 添加商品海报信息到sku_poster
        if (!CollectionUtils.isEmpty(skuInfoVo.getSkuPosterList())) {
            skuInfoVo.getSkuPosterList().forEach(skuPoster -> skuPoster.setSkuId(skuInfo.getId()));
            skuPosterService.saveBatch(skuInfoVo.getSkuPosterList());
        }

        // 更新商品属性信息
        skuAttrValueService.remove(new LambdaQueryWrapper<SkuAttrValue>().eq(SkuAttrValue::getSkuId, skuInfo.getId()));
        // 添加商品属性分组信息到sku_attr_value
        if (!CollectionUtils.isEmpty(skuInfoVo.getSkuAttrValueList())) {
            skuInfoVo.getSkuAttrValueList().forEach(skuAttrValue -> skuAttrValue.setSkuId(skuInfo.getId()));
            skuAttrValueService.saveBatch(skuInfoVo.getSkuAttrValueList());
        }
    }

    @Override
    public boolean contains(Long id) {
        return baseMapper.selectCount(new LambdaQueryWrapper<SkuInfo>().eq(SkuInfo::getId, id)) > 0;
    }

    @Override
    public void publishById(Long id, Integer status) {
        if (!contains(id)) {
            throw new UuPreferredException(ResultCodeEnum.SKU_NO_EXIST);
        }
        // 修改sku状态
        SkuInfo skuInfo = new SkuInfo();
        skuInfo.setId(id);
        skuInfo.setPublishStatus(status);
        baseMapper.updateById(skuInfo);
        //发送相关信息到mq
        if (status == 1) {//上架
            rabbitService.sendMessage(
                    MqConst.EXCHANGE_GOODS_DIRECT,
                    MqConst.ROUTING_GOODS_UPPER,
                    id);
        } else {//下架
            rabbitService.sendMessage(
                    MqConst.EXCHANGE_GOODS_DIRECT,
                    MqConst.ROUTING_GOODS_LOWER,
                    id);
        }
    }

    @Override
    public void checkById(Long id, Integer status) {
        if (contains(id)) {
            SkuInfo skuInfo = new SkuInfo();
            skuInfo.setId(id);
            skuInfo.setCheckStatus(status);
            baseMapper.updateById(skuInfo);
        } else {
            throw new UuPreferredException(ResultCodeEnum.SKU_NO_EXIST);
        }
    }

    @Override
    public void updateIsNewPersonById(Long id, Integer status) {
        if (contains(id)) {
            SkuInfo skuInfo = new SkuInfo();
            skuInfo.setId(id);
            skuInfo.setIsNewPerson(status);
            baseMapper.updateById(skuInfo);
        } else {
            throw new UuPreferredException(ResultCodeEnum.SKU_NO_EXIST);
        }
    }

    @Override
    public void removeByIdWithEs(Long id) {
        baseMapper.deleteById(id);
        rabbitService.sendMessage(
                MqConst.EXCHANGE_GOODS_DIRECT,
                MqConst.ROUTING_GOODS_DELETE,
                id);
    }

    @Override
    public void removeByIdsWithEs(List<Long> ids) {
        baseMapper.deleteBatchIds(ids);
        rabbitService.sendMessage(
                MqConst.EXCHANGE_GOODS_DIRECT,
                MqConst.ROUTING_GOODS_BATCH_DELETE,
                ids);
    }

    @Override
    public List<SkuInfo> selectByName(String keyword) {
        return baseMapper.selectList(
                new LambdaQueryWrapper<SkuInfo>().like(SkuInfo::getSkuName, keyword)
        );
    }
}
